#include "queue.h"
#include "NTPTime.h"
#include "utils.h"

// 计算队列中有效元素的平均值
    float Queue::average() {
        if (isEmpty()) {
            return 0.0;
        }
        if(lastCallTime==0){
            lastCallTime=getRtcTime().getEpoch();
        }

        if(getRtcTime().getEpoch()-lastCallTime<=1&&cacheAverage>0){
            return cacheAverage;
        }


        long sum = 0; // 使用 long 类型以避免整数溢出（如果元素数量很多或元素值很大）
        int currentIndex = front;
        for (int i = 0; i < count; ++i) {
            sum += items[currentIndex];
            currentIndex = (currentIndex + 1) % QUEUE_SIZE; // 循环遍历队列
        }
 
        cacheAverage =  static_cast<float>(sum) / count; // 转换为 double 类型以进行浮点除法
        lastCallTime = getRtcTime().getEpoch();
        return cacheAverage;
    }

    // 检查队列是否为空
    bool Queue::isEmpty()
    {
        return count == 0;
    }

    // 检查队列是否已满
    bool Queue::isFull()
    {
        return count == QUEUE_SIZE;
    }

    // 向队列中添加元素
    bool Queue::enqueue(long item)
    {
        if (isFull())
        {
            return false; // 队列已满，无法添加元素
        }
        items[rear] = item;
        rear = (rear + 1) % QUEUE_SIZE; // 循环队列
        count++;
        return true;
    }

    // 如果已滿，从头删一个，再在尾部添加一个
    void Queue::forceEnqueue(long item)
    {
        if (enqueue(item))
        {
            return;
        }
        long temp;
        dequeue(temp);
        enqueue(item);
    }

    // 从队列中移除元素
    bool Queue::dequeue(long &item)
    {
        if (isEmpty())
        {
            return false; // 队列为空，无法移除元素
        }
        item = items[front];
        front = (front + 1) % QUEUE_SIZE; // 循环队列
        count--;
        return true;
    }

    // 获取队列头部的元素（不移除）
    bool Queue::peek(long &item)
    {
        if (isEmpty())
        {
            return false; // 队列为空
        }
        item = items[front];
        return true;
    }

    // 获取队列中元素的数量
    long  Queue::size()
    {
        return count;
    }

    void Queue::saveSp(){

        String data;
        for (size_t i = 0; i < size(); i++)
        {
           long item =    items[i];
           data+=String(item)+String(",");
        }
        data.remove(data.length()-1);
        
        putPreferenceString("",data);
        
    }
    void Queue::readFromSp(){

    }